#include "login.h"
#include "log.h"
#include "database.h"

// 保存登录成功的 用户 和 商家 
  int fdArr[1000];                         //套接字数组
  char nameArr[1000][128];                    //名字数组
 int login_count = 0;                           //登录的人数


//
//并查询离线时间 有没有未读的信息 将其发送过去
//
//用户登录     登录就绑定 套接字和唯一用户名 并查询离线时间 有没有未读的信息 将其发送过去
bool loginFUN(int fd, MSG msg)
{
     LOGIN *LG = (LOGIN *)msg.data;
     DEBUG("收到的登录消息的%s %s", LG->name, LG->pwd);

     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from people where name='%s' and pwd = '%s'", LG->name, LG->pwd);
     // 执行查询语句并且返回执行结果
     RET ret = database_query(db, sql);
     // 打印查询数据库的结果
     printdatabase(ret);

     DEBUG("服务器接收登录消息 并且检测数据库 的返回值是 %d 行 %d列\n",ret.row,ret.col);
     if (ret.row > 0  ) // 说明该用户名和密码在数据库中存在记录
     {
          // 注意群发是只发给登录在线的用户 或者发送到没在线用户的 数据库的专属表中
          // 注意群发是只发给登录在线的用户 或者发送到没在线用户的 数据库的专属表中
          // 注意群发是只发给登录在线的用户 或者发送到没在线用户的 数据库的专属表中
          // fdArr[login_count] = fd;//保存当前登录成功的套接字
          // login_count++;//登录人数+1
          
          msg.type = _yes; // 登录成功

          //登录成功保存 用户名和套接字准备私聊检索
          fdArr[login_count] = fd;//保存当前登录成功的套接字
          strcpy(nameArr[login_count],LG->name);//保存当前登录成功的用户的名字
          login_count++;//登录人数+1

          //更新绑定套接字 并更新绑定时间
          char sqll[256];

          time_t updata_time_user_login;
          time(&updata_time_user_login);
          sprintf(sqll, "UPDATE people SET user_fd = '%d' ,updata_time= %ld WHERE name = '%s';" , fd , (long)updata_time_user_login, LG->name );
          exec_sql(db , sqll);
          
          send(fd, &msg, sizeof(msg), 0); // 把结果返回给客户端
          
          return true;
     }
     else
     {
          msg.type = _no; // 登录失败
          send(fd, &msg, sizeof(msg), 0); // 把结果返回给客户端
          return false;
     }
}

//
//并查询离线时间 有没有未读的信息 将其发送过去
//
//商家 登录      登录就绑定 套接字和唯一用户名   并查询离线时间有没有未读的信息 将其发送过去
bool loginFUN_merchant(int fd, MSG msg)
{
     LOGIN *LG = (LOGIN *)msg.data;
     DEBUG("收到的登录消息的%s %s", LG->name, LG->pwd);

     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from merchant where name='%s' and pwd = '%s'", LG->name, LG->pwd);
     // 执行查询语句并且返回执行结果
     RET ret = database_query(db, sql);
     // 打印查询数据库的结果
     DEBUG("打印查询数据库的结果");
     printdatabase(ret);

     if (ret.row > 0) // 说明该用户名和密码在数据库中存在记录
     {
          // 注意群发是只发给登录在线的用户 或者发送到没在线用户的 数据库的专属表中
          // 注意群发是只发给登录在线的用户 或者发送到没在线用户的 数据库的专属表中
          // 注意群发是只发给登录在线的用户 或者发送到没在线用户的 数据库的专属表中
          // fdArr[login_count] = fd;//保存当前登录成功的套接字
          // login_count++;//登录人数+1

          msg.type = _yes; // 登录成功
          
          //登录成功保存 用户名和套接字准备私聊检索
          fdArr[login_count] = fd;//保存当前登录成功的套接字
          strcpy(nameArr[login_count],LG->name);//保存当前登录成功的用户的名字
          login_count++;//登录人数+1

          //更新绑定套接字
          char sqll[256];
          //更新绑定时间
          time_t updata_time_user_login;
          time(&updata_time_user_login);
          sprintf(sqll, "UPDATE merchant SET merchant_fd = '%d', updata_time=%ld WHERE name = '%s';" , fd , (long)updata_time_user_login,LG->name );
          exec_sql(db , sqll);

          send(fd, &msg, sizeof(msg), 0); // 把结果返回给客户端
          return true;
     }
     else
     {
          msg.type = _no; // 登录失败
          send(fd, &msg, sizeof(msg), 0); // 把结果返回给客户端
          return false;
     }
     
     
}

// 注册 用户
bool registerFun(int fd, MSG msg)
{
     REGIST *RG = (REGIST *)msg.data;
     DEBUG("收到的注册消息的%s %s %s", RG->name, RG->pwd, RG->find);

     // 查找数据库中有没有用户名重复的
     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from people where name='%s' ", RG->name);
     // 执行查询语句并且返回执行结果
     RET ret = database_query(db, sql);
     if (ret.row > 0) // 说明该用户名在数据库中存在记录
     {
          msg.type = _no; // 注册失败 已经有存在的用户名
          memcpy(msg.data, "已经有用户名存在了 换个名字吧", sizeof("已经有用户名存在了 换个名字吧"));
          send(fd, &msg, sizeof(msg), 0);
          return false;
     }

     // 查手机有没有重复
     // 根据客户端发来的数据构建SQL语句
     char sqll[256];
     sprintf(sqll, "select * from people where tel='%s' ", RG->find);
     // 执行查询语句并且返回执行结果
     RET reet = database_query(db, sqll);
     if (reet.row > 0) // 说明该手机在数据库中存在记录
     {
          msg.type = _no; // 注册失败 手机号已经绑定了用户
          memcpy(msg.data, "该手机号已经绑定了用户，请换一个手机号", sizeof("该手机号已经绑定了用户，请换一个手机号"));
          send(fd, &msg, sizeof(msg), 0);
          return false;
     }

     // 没有就写到数据库中

     char sq[256];
     sprintf(sq, "INSERT INTO people(name, pwd ,tel ,flag,value ) VALUES \
     ('%s','%s','%s','%d','%d');", RG->name, RG->pwd,\
      RG->find, RG->flag, RG->value);
     exec_sql(db, sq);
     msg.type = _yes;
     send(fd, &msg, sizeof(msg), 0);
     return true;
}

// 注册 商家
bool registerFun_merchant(int fd, MSG msg)
{
     REGIST *RG = (REGIST *)msg.data;
     DEBUG("收到的注册消息的%s %s %s", RG->name, RG->pwd, RG->find);

     // 查找数据库中有没有用户名重复的
     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from merchant where name='%s' ", RG->name);
     // 执行查询语句并且返回执行结果
     RET ret = database_query(db, sql);
     if (ret.row > 0) // 说明该用户名在数据库中存在记录
     {
          msg.type = _no; // 注册失败 已经有存在的用户名
          memcpy(msg.data, "已经有商家名存在了 换个名字吧", sizeof("已经有商家名存在了 换个名字吧"));
          send(fd, &msg, sizeof(msg), 0);
          return false;
     }

     // 查手机有没有重复
     // 根据客户端发来的数据构建SQL语句
     char sqll[256];
     sprintf(sqll, "select * from merchant where tel='%s' ", RG->find);
     // 执行查询语句并且返回执行结果
     RET reet = database_query(db, sqll);
     if (reet.row > 0) // 说明该手机在数据库中存在记录
     {
          msg.type = _no; // 注册失败 手机号已经绑定了用户
          memcpy(msg.data, "该手机号已经绑定了商家，请换一个手机号", sizeof("该手机号已经绑定了用户，请换一个手机号"));
          send(fd, &msg, sizeof(msg), 0);
          return false;
     }

     // 没有就写到数据库中

     char sq[256];
     sprintf(sq, "INSERT INTO merchant(name, pwd ,tel ,flag ,value) VALUES ('%s','%s','%s', \
     '%d','%d');", RG->name, RG->pwd, RG->find, RG->flag, RG->value);
     exec_sql(db, sq);

     msg.type = _yes;
     send(fd, &msg, sizeof(msg), 0);
     return true;
}

//密码找回 用户 商家
void findpws(int fd ,MSG msg){
     REGIST  *LG = (REGIST  *)msg.data;
     DEBUG("收到的密码找回消息的用户名%s 手机号%s", LG->name, LG->find);

     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from people where name='%s' and tel = '%s'", LG->name, LG->find);
     // 执行查询语句并且返回执行结果
     RET ret = database_query(db, sql);
     // 打印查询数据库的结果
     printdatabase(ret);
     printf("打印退出了****\n");
     if (ret.row > 0) // 说明该用户名和密码在数据库中存在记录
     {
          //存在用户 发送密码给客户端
          msg.type = _yes;
          strcpy(msg.data , ret.result[ret.col + 1]);
          DEBUG("发送给客户端 用户  的密码是%s\n" ,msg.data);

          send(fd, &msg, sizeof(msg), 0);
          
     }
     else{
          
          msg.type = _no; // 登录失败
          send(fd, &msg, sizeof(msg), 0); // 把结果返回给客户端
          
     
     }
}

//密码找回 商家
void findpws_merchant(int fd ,MSG msg){
     REGIST  *LG = (REGIST  *)msg.data;
     DEBUG("收到的密码找回消息的商家名%s 手机号%s", LG->name, LG->find);

     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from merchant where name='%s' and tel = '%s'", LG->name, LG->find);
     // 执行查询语句并且返回执行结果
     RET ret = database_query(db, sql);
     // 打印查询数据库的结果
     printdatabase(ret);

     if (ret.row > 0) // 说明该用户名和密码在数据库中存在记录
     {
          //存在用户 发送密码给客户
          msg.type = _yes;
          strcpy(msg.data , ret.result[ret.col + 1]);
           DEBUG("发送给客户端  商家  的密码是%s\n" ,msg.data);
          send(fd, &msg, sizeof(msg), 0);
          
     }
     else{
          
          msg.type = _no; // 登录失败
          send(fd, &msg, sizeof(msg), 0); // 把结果返回给客户端
          
     
     }
}
